﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncUnitTest
{
    /// <summary>
    /// Task.Run(()=>{},cts.Token) 在这里设置取消令牌，如果在任务开始之前就取消，那么该任务不会被创建，节省资源
    /// if (cts.IsCancellationRequested)//在任务开始之后，在耗时操作开始之前判断，手动控制不要执行后续操作，节省资源
    /// </summary>
    public class Cts理解
    {
        public static void Go()
        {
            var cts = new CancellationTokenSource();
            cts.CancelAfter(300);
            cts.Token.Register(() => Console.WriteLine("任务被取消........."));
            for (int i = 1; i <= 500; i++)
            {
                int j = i;
                Task.Run(() =>
                {
                    Console.WriteLine($" {j}  任务开始...");
                    Thread.Sleep(900);//耗时操作
                    if (cts.IsCancellationRequested)//在耗时操作开始之前判断
                        return;
                    Thread.Sleep(200);//耗时操作
                    Console.WriteLine($" {j}  任务结束...");
                }, cts.Token);
            }

            Thread.Sleep(80000);
        }
        //如果任务里面的不加，取消之后，之前已经开始的任务会继续执行完成。
        //外面的不加，循环500次每一次都会创建task任务，到里面return，时候任务结束，浪费大量资源
    }
}
